/******************************************************
Cours: LOG121
Session: A2012
Groupe: 01
Projet: Laboratoire #1
Étudiant(e)s: Guillaume Boulay
              Pierre-Olivier Dubé
              Sébastien Gergel
Professeur et chargé de labo : Patrice Boucher
Nom du fichier: MainFrame.java
Date crée: 2012-10-16
Date dern. modif. 2012-10-31
*******************************************************
Historique des modifications
*******************************************************
2012-10-31 Ajout de constantes (Guillaume Boulay)
*******************************************************/

package manager;
import javax.swing.*;

import server.RequestManager;
import utils.Constant;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Enumeration;

/**
 * Cette classe définit la fenêtre principale, l'interface graphique qui
 * permet de contrôler l'application.
 * <br \>
 * Elle communique avec ... <br/> 
 * - DisplayManager pour afficher des formes <br/>
 * - RequestManager pour modifier les informations du serveur <br/>
 * - AboutFrame pour afficher les informations des développeurs de l'application 
 * 
 * @author Pierre-Olivier Dubé
 */
@SuppressWarnings("serial")
public class MainFrame extends JFrame 
{
    DisplayManager dm = new DisplayManager();
    ButtonGroup group;
    
    /**
     * Constructeur par défaut
     * 
     */
    public MainFrame()
    {               
        /**
         * INTERFACE
         */     
        this.setSize(Constant.WIDTH, Constant.HEIGHT);
        this.setLayout(null);
        this.setDefaultCloseOperation(1);
        
        JPanel pan = new JPanel();
        pan.setSize(Constant.WIDTH, Constant.HEIGHT);
        pan.setLocation(0, 0);
        pan.setLayout(null);
        
        this.add(pan);
        
        dm.setLocation(0, 0);
        dm.setBackground(Color.WHITE);
        pan.add(dm);        
        
        /**
         * EVENTS
         */
        ActionListener menuExitListener = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                System.exit(0);
            }
        };
        
        ActionListener menuConfigListener = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                changeServerInfos();
            }
        };
        
        ActionListener menuGenerateOneListener = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                try
                {
                    dm.generateShape();
                }
                catch (IOException ex)
                {
                    JOptionPane.showMessageDialog(null, "Une erreur a empêché la forme d'être générée.");
                }
            }
        };
        
        ActionListener menuGenerateManyListener = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                try
                {
                	String selectedButtonText = "";
                	
                	for(Enumeration<AbstractButton> btns = group.getElements(); btns.hasMoreElements();) 
                	{
                        AbstractButton button = btns.nextElement();
                        
                        if (button instanceof JRadioButtonMenuItem)
                        {
                        	 if (((JRadioButtonMenuItem)button).isSelected())
                             	selectedButtonText = ((JRadioButtonMenuItem)button).getText();
                        }
                	}                	
                    
                	//for (JRadioButtonMenuItem btn : group.getElements()<JRadioButtonMenuItem>; group.getElements().hasMoreElements();)
                    dm.generateShapes(selectedButtonText);
                }
                catch (IOException ex)
                {
                    JOptionPane.showMessageDialog(null, "Une erreur a empêché la forme d'être générée.");
                }
            }
        };
        
        ActionListener menuAboutListener = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                AboutFrame af = new AboutFrame();
                af.setVisible(true);
            }
        };
        
        ActionListener menuChangeOrder = new ActionListener() 
        {           
            @Override
            public void actionPerformed(ActionEvent e) 
            {
            	String selectedButtonText = "";
            	
            	for(Enumeration<AbstractButton> btns = group.getElements(); btns.hasMoreElements();) 
            	{
                    AbstractButton button = btns.nextElement();
                    
                    if (button instanceof JRadioButtonMenuItem)
                    {
                    	 if (((JRadioButtonMenuItem)button).isSelected())
                         	selectedButtonText = ((JRadioButtonMenuItem)button).getText();
                    }
            	}  
            	
            	dm.changeOrder(selectedButtonText);
            }
        };
        
        
        /**
         * MENUS
         */
        JMenuBar menu = new JMenuBar();
        this.setJMenuBar(menu); 
        
        /**
         * MENU FICHIER
         */     
        JMenu menuFile = new JMenu("Fichier");
        menu.add(menuFile);
        
        JMenuItem menuExit = new JMenuItem("Quitter");
        menuExit.addActionListener(menuExitListener);       
        menuFile.add(menuExit); 
        
        /**
         * MENU SERVEUR
         */     
        JMenu menuServer = new JMenu("Serveur");
        menu.add(menuServer);
        
        JMenuItem menuConfig = new JMenuItem("Configuration...");
        menuConfig.addActionListener(menuConfigListener);       
        menuServer.add(menuConfig);     
        
        JMenuItem menuGenerateOne = new JMenuItem("Générer une forme");
        menuGenerateOne.addActionListener(menuGenerateOneListener);     
        menuServer.add(menuGenerateOne);            

        JMenuItem menuGenerateMany = new JMenuItem("Générer des formes");
        menuGenerateMany.addActionListener(menuGenerateManyListener);       
        menuServer.add(menuGenerateMany);
        
        /**
         * MENU ORDRE
         */
        JMenu menuOrder = new JMenu("Ordre");
        menu.add(menuOrder);
        
        JRadioButtonMenuItem menuRadioIdCroissant = new JRadioButtonMenuItem(Constant.ORDRE_ID_CROISSANT);
        menuRadioIdCroissant.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioIdCroissant);
        
        JRadioButtonMenuItem menuRadioIdDecroissant = new JRadioButtonMenuItem(Constant.ORDRE_ID_DECROISSANT);
        menuRadioIdDecroissant.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioIdDecroissant);
        
        JRadioButtonMenuItem menuRadioAireCroissant = new JRadioButtonMenuItem(Constant.ORDRE_AIRE_CROISSANT);
        menuRadioAireCroissant.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioAireCroissant);
        
        JRadioButtonMenuItem menuRadioAireDecroissant = new JRadioButtonMenuItem(Constant.ORDRE_AIRE_DECROISSANT);
        menuRadioAireDecroissant.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioAireDecroissant);
        
        JRadioButtonMenuItem menuRadioDistance = new JRadioButtonMenuItem(Constant.ORDRE_DISTANCE);
        menuRadioDistance.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioDistance);
        
        JRadioButtonMenuItem menuRadioCarreLigne = new JRadioButtonMenuItem(Constant.ORDRE_CARRE_LIGNE);
        menuRadioCarreLigne.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioCarreLigne);
        
        JRadioButtonMenuItem menuRadioLigneCarre = new JRadioButtonMenuItem(Constant.ORDRE_LIGNE_CARRE);
        menuRadioLigneCarre.addActionListener(menuChangeOrder);
        menuOrder.add(menuRadioLigneCarre);
        
        group = new ButtonGroup();
        group.add(menuRadioIdCroissant);
        group.add(menuRadioIdDecroissant);
        group.add(menuRadioAireCroissant);
        group.add(menuRadioAireDecroissant);
        group.add(menuRadioDistance);
        group.add(menuRadioCarreLigne);
        group.add(menuRadioLigneCarre);

        /**
         * MENU AIDE
         */
        JMenu menuHelp = new JMenu("Aide");
        menu.add(menuHelp);
        
        JMenuItem menuAbout = new JMenuItem("À propos...");
        menuAbout.addActionListener(menuAboutListener);     
        menuHelp.add(menuAbout);    
    }
    
    /**
     * Cette fonction permet de changer les informations du serveur 
     * (adresse IP / port)
     * <br/>
     * Elle communique avec RequestManager et envoie la string entrée par 
     * l'utilisateur. Un message d'erreur est alors renvoyé si le serveur 
     * est introuvable.
     */
    private void changeServerInfos()
    {
        String newSocketConfig = 
                JOptionPane.showInputDialog("Quel est le nom d'hôte et le port du serveur?");
            
        if (newSocketConfig != null)
        {
            try 
            {
                RequestManager.setServerParameter(newSocketConfig);
            } 
            catch (Exception e1) 
            {
                JOptionPane.showMessageDialog(null, "Le serveur est introuvable.");
            }
        }
    }
}